rm(list = ls())
setwd('~/Desktop/Networks & Predictive Analytics/Project/')
library(igraph)

Attaching package: ‘igraph’

The following objects are masked from ‘package:stats’:

    decompose, spectrum

The following object is masked from ‘package:base’:

    union
de_edges = as.data.frame(read.csv('de_edges.csv', header = TRUE))
de_nodes = as.data.frame(read.csv('de_nodes.csv', header = TRUE))

engb_edges = as.data.frame(read.csv('ENGB_edges.csv', header = TRUE))
engb_nodes = as.data.frame(read.csv('ENGB_nodes.csv', header = TRUE))

es_edges = as.data.frame(read.csv('ES_edges.csv', header = TRUE))
es_nodes = as.data.frame(read.csv('ES_nodes.csv', header = TRUE))

fr_edges = as.data.frame(read.csv('FR_edges.csv', header = TRUE))
fr_nodes = as.data.frame(read.csv('FR_nodes.csv', header = TRUE))

ptbr_edges = as.data.frame(read.csv('PTBR_edges.csv', header = TRUE))
ptbr_nodes = as.data.frame(read.csv('PTBR_nodes.csv', header = TRUE))

ru_edges = as.data.frame(read.csv('RU_edges.csv', header = TRUE))
ru_nodes = as.data.frame(read.csv('RU_nodes.csv', header = TRUE))

all_edges = as.data.frame(read.csv('twitch_edges.csv', header = TRUE))
all_nodes = as.data.frame(read.csv('twitch_nodes.csv', header = TRUE))
de_g <- graph_from_data_frame(de_edges, directed = FALSE, vertices = de_nodes)
engb_g <- graph_from_data_frame(engb_edges, directed = FALSE, vertices = engb_nodes)
es_g <- graph_from_data_frame(es_edges, directed = FALSE, vertices = es_nodes)
fr_g <- graph_from_data_frame(fr_edges, directed = FALSE, vertices = fr_nodes)
ptbr_g <- graph_from_data_frame(ptbr_edges, directed = FALSE, vertices = ptbr_nodes)
ru_g <- graph_from_data_frame(ru_edges, directed = FALSE, vertices = ru_nodes)
all_g <- graph_from_data_frame(all_edges, directed = FALSE, vertices = all_nodes)
C_Names <- c("DE", "ENGB", "ES", "FR", "PTBR", "RU", "ALL")
No_Nodes <- c(length(V(de_g)), length(V(engb_g)), length(V(es_g)), length(V(fr_g)), length(V(ptbr_g)), length(V(ru_g)), length(V(all_g)))
No_Edges <- c(length(E(de_g)), length(E(engb_g)), length(E(es_g)), length(E(fr_g)), length(E(ptbr_g)), length(E(ru_g)), length(E(all_g)))
NW_Diameter <- c(diameter(de_g), diameter(engb_g), diameter(es_g), diameter(fr_g), diameter(ptbr_g), diameter(ru_g), 'NA')
NW_Avg_Dist <- c(mean_distance(de_g), mean_distance(engb_g), mean_distance(es_g), mean_distance(fr_g), mean_distance(ptbr_g), mean_distance(ru_g), 'NA')
NW_Density <- c(edge_density(de_g), edge_density(engb_g), edge_density(es_g), edge_density(fr_g), edge_density(ptbr_g), edge_density(ru_g), 'NA')
NW_Avg_Degree <- c(mean(degree(de_g)), mean(degree(engb_g)), mean(degree(es_g)), mean(degree(fr_g)), mean(degree(ptbr_g)), mean(degree(ru_g)), 'NA')
NW_Cohesion <- c(cohesion(de_g), cohesion(engb_g), cohesion(es_g), cohesion(fr_g), cohesion(ptbr_g), cohesion(ru_g), 'NA')
NW_Compactness <- c(mean(closeness(de_g)), mean(closeness(engb_g)), mean(closeness(es_g)), mean(closeness(fr_g)), mean(closeness(ptbr_g)), mean(closeness(ru_g)), 'NA')
f_info <- data.frame(C_Names, No_Nodes, No_Edges, NW_Diameter, NW_Avg_Dist, NW_Density, NW_Avg_Degree, NW_Compactness)
f_info
rm(list = ls())
library(igraph)
library("RColorBrewer")

pal <- brewer.pal(12, 'Set3')
pal2 <- brewer.pal(11, 'Spectral')

ptbr_edges = as.data.frame(read.csv('PTBR_edges.csv', header = TRUE))
ptbr_nodes = as.data.frame(read.csv('PTBR_nodes.csv', header = TRUE))

ptbr_g <- graph_from_data_frame(ptbr_edges, directed = FALSE, vertices = ptbr_nodes)
ptbr_g
IGRAPH a7f9ff1 UN-- 1912 31299 -- 
+ attr: name (v/c), days (v/n), mature (v/l), views (v/n), partner (v/l), twitch_id (v/n)
+ edges from a7f9ff1 (vertex names):
 [1] ptbr_0   --ptbr_92   ptbr_0   --ptbr_428  ptbr_689 --ptbr_1    ptbr_1147--ptbr_1    ptbr_1666--ptbr_1   
 [6] ptbr_179 --ptbr_2    ptbr_2   --ptbr_587  ptbr_474 --ptbr_2    ptbr_287 --ptbr_2    ptbr_126 --ptbr_2   
[11] ptbr_590 --ptbr_2    ptbr_289 --ptbr_2    ptbr_2   --ptbr_530  ptbr_2   --ptbr_291  ptbr_848 --ptbr_2   
[16] ptbr_267 --ptbr_2    ptbr_1177--ptbr_2    ptbr_2   --ptbr_920  ptbr_2   --ptbr_689  ptbr_2   --ptbr_1785
[21] ptbr_2   --ptbr_923  ptbr_417 --ptbr_2    ptbr_2   --ptbr_1619 ptbr_1040--ptbr_2    ptbr_656 --ptbr_2   
[26] ptbr_2   --ptbr_1432 ptbr_486 --ptbr_2    ptbr_786 --ptbr_2    ptbr_1138--ptbr_2    ptbr_1423--ptbr_2   
[31] ptbr_425 --ptbr_2    ptbr_1365--ptbr_2    ptbr_2   --ptbr_19   ptbr_2   --ptbr_1327 ptbr_1025--ptbr_2   
[36] ptbr_132 --ptbr_2    ptbr_2   --ptbr_866  ptbr_2   --ptbr_1694 ptbr_2   --ptbr_1443 ptbr_608 --ptbr_2   
+ ... omitted several edges
plot(ptbr_g, layout=layout_with_kk, vertex.size= 5, vertex.label= NA, vertex.color = 'skyblue', main="Network Before Filtering")

hist(centralization.degree(ptbr_g, mode='all')$res, breaks = 100, xlab = 'Degree', ylab = 'Frequency', main = 'Histogram of Degree Centrality\n Before Filtering')

ptbr_nodes_min <- ptbr_nodes[order(-ptbr_nodes$views),][1:100,]
ptbr_edges_min <- ptbr_edges[which(ptbr_edges$from %in% ptbr_nodes_min$id & ptbr_edges$to %in% ptbr_nodes_min$id),]
par(mfrow=c(1,2), mar=c(1,1,1,1))
ptbr_g_min <- graph_from_data_frame(ptbr_edges_min, directed = FALSE, vertices = ptbr_nodes_min)
plot(ptbr_g, layout=layout_with_kk, vertex.size= 5, vertex.label= NA, vertex.color = 'skyblue', main="Network Before Filtering")
plot(ptbr_g_min, layout=layout_with_kk, vertex.size= 8, vertex.label= NA, vertex.color= 'skyblue', main="Network After Filtering")

as_data_frame(ptbr_g_min, what="vertices")
ptbr_colnames <- c("Size", "No_Edges", "Diameter", "Average Distance", "Degree Centrality", "SD Degree Centrality", "Closeness Centrality", "SD Closeness Centrality", "Betweenness Centrality", "SD Betweenness Centrality", "Density", "Average Degree", "Cohesion", "Compactness", "Clustering Coefficient")

ptbr_values <- c(length(V(ptbr_g_min)), length(E(ptbr_g_min)), diameter(ptbr_g_min), mean_distance(ptbr_g_min), centralization.degree(ptbr_g_min)$centralization, sd(centralization.degree(ptbr_g_min)$res), centralization.closeness(ptbr_g_min)$centralization, sd(centralization.closeness(ptbr_g_min)$res), centralization.betweenness(ptbr_g_min)$centralization, sd(centralization.betweenness(ptbr_g_min)$res), edge_density(ptbr_g_min), mean(degree(ptbr_g_min)), cohesion(ptbr_g_min), mean(closeness(ptbr_g_min)), transitivity(ptbr_g_min,type="global"))
ptbr_info <- data.frame(ptbr_colnames, ptbr_values)
colnames(ptbr_info) <- c('Metric','Values')
ptbr_info
par(mfrow=c(1,2), mar=c(2,2,2,2))
hist(centralization.degree(ptbr_g, mode='all')$res, breaks = 100, xlab = 'Degree', ylab = 'Frequency', main = 'Histogram of Degree Centrality\n Before Filtering')
hist(centralization.degree(ptbr_g_min, mode='all')$res, breaks = 100, xlab = 'Degree', ylab = 'Frequency', main = 'Histogram of Degree Centrality\n After Filtering')

set.seed(1000)
par(mfrow = c(1, 2), mar = c(2, 2, 2, 2))
c_g2 <- fastgreedy.community(ptbr_g_min)
res_g2 <- simplify(contract(ptbr_g_min, membership(c_g2)), remove.multiple = TRUE, remove.loops = TRUE)
plot(res_g2, vertex.size= 10, vertex.label = NA, layout=layout_with_kk, vertex.color=pal, main="FastGreedy Community")

c_g3 <- cluster_louvain(ptbr_g_min)
res_g3 <- simplify(contract(ptbr_g_min, membership(c_g3)), remove.multiple = TRUE, remove.loops = TRUE)
#plot(res_g3, vertex.size= 10, vertex.label = NA, main = length(res_g3), layout=layout_with_kk, vertex.color=pal)

c_g4 <- spinglass.community(ptbr_g_min)
res_g4 <- simplify(contract(ptbr_g_min, membership(c_g4)), remove.multiple = TRUE, remove.loops = TRUE)
plot(res_g4, vertex.size= 10, vertex.label = NA, main = "Spinglass Community", layout=layout_with_kk, vertex.color=pal)


c_g5 <- walktrap.community(ptbr_g_min)
res_g5 <- simplify(contract(ptbr_g_min, membership(c_g5)), remove.multiple = TRUE, remove.loops = TRUE)
#plot(res_g5, vertex.size= 10, vertex.label = NA, main = length(res_g5), layout=layout_with_kk, vertex.color=pal)
c_g_groups2 <- groups(c_g2)
sort(lengths(c_g_groups2), decreasing = TRUE)
 1  3  2 
51 43  6 
c_g_groups4 <- groups(c_g4)
sort(lengths(c_g_groups4), decreasing = TRUE)
 3  1  2 
39 33 28 
par(mfrow = c(1, 2), mar = c(2, 2, 2, 2))
plot(ptbr_g_min, vertex.color=pal[membership(c_g2)], layout=layout_with_kk, vertex.size= 10, vertex.label.cex = 0.5, main="Fast Greedy Community")
plot(ptbr_g_min, vertex.color=pal[membership(c_g4)], layout=layout_with_kk, vertex.size= 10, vertex.label.cex = 0.5, main="SpinGlass Community")

library(threejs)
Registered S3 methods overwritten by 'htmltools':
  method               from         
  print.html           tools:rstudio
  print.shiny.tag      tools:rstudio
  print.shiny.tag.list tools:rstudio
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
net <- ptbr_g_min
V(net)$color <- pal[membership(c_g2)]
V(net)$size <- 5
E(net)$color = 'black'

graphjs(net, showLabels = T)
library(threejs)

net <- ptbr_g_min
V(net)$color <- pal[membership(c_g4)]
V(net)$size <- 5
E(net)$color = 'black'

graphjs(net, showLabels = T)
par(mfrow=c(1,2), mar=c(1,1,1,1))
ptbr_g_min_dcent <- delete_vertices(ptbr_g_min, "ptbr_382")

V(ptbr_g_min_dcent)$dcent <- centralization.degree(ptbr_g_min_dcent)$res
V(ptbr_g_min_dcent)$color <- ifelse(V(ptbr_g_min_dcent)$dcent > 49, pal2, 'white')

ptbr_g_min_dcent_tt <- induced_subgraph(ptbr_g_min_dcent, V(ptbr_g_min_dcent)[which(V(ptbr_g_min_dcent)$dcent > 49)])

plot(ptbr_g_min_dcent, vertex.size=V(ptbr_g_min_dcent)$dcent*0.25, vertex.label= NA, layout=layout_with_fr, main="Degree Centrality")

plot(ptbr_g_min_dcent_tt, vertex.label.cex= 1, vertex.size=V(ptbr_g_min_dcent_tt)$dcent*0.30, layout=layout_with_fr, main="Degree Centrality for Top 11")

par(mfrow=c(1,2), mar=c(1,1,1,1))
ptbr_g_min_evcent <- delete_vertices(ptbr_g_min, "ptbr_382")

V(ptbr_g_min_evcent)$evcent <- eigen_centrality(ptbr_g_min_evcent)$vector
V(ptbr_g_min_evcent)$color <- ifelse(V(ptbr_g_min_evcent)$evcent > 0.8589211, pal2, 'white')

ptbr_g_min_evcent_tt <- induced_subgraph(ptbr_g_min_evcent, V(ptbr_g_min_evcent)[which(V(ptbr_g_min_evcent)$evcent > 0.8589211)])

plot(ptbr_g_min_evcent, vertex.size=V(ptbr_g_min_evcent)$evcent*15, vertex.label= NA, edge.arrow.size=.4, layout=layout_with_fr, main="EigenVector Centrality")

plot(ptbr_g_min_evcent_tt, vertex.size=V(ptbr_g_min_evcent_tt)$evcent*20, vertex.label.cex= 1, layout=layout_with_fr, main="EigenVector Centrality for Top 10")

par(mfrow=c(1,2), mar=c(1,1,1,1))
ptbr_g_min_ccent <- delete_vertices(ptbr_g_min, "ptbr_382")

V(ptbr_g_min_ccent)$ccent <- centralization.closeness(ptbr_g_min_ccent)$res
V(ptbr_g_min_ccent)$color <- ifelse(V(ptbr_g_min_ccent)$ccent > 0.6666667, pal2, 'white')

ptbr_g_min_ccent_tt <- induced_subgraph(ptbr_g_min_ccent, V(ptbr_g_min_ccent)[which(V(ptbr_g_min_ccent)$ccent > 0.6666667)])

plot(ptbr_g_min_ccent, vertex.size=V(ptbr_g_min_ccent)$ccent*15, vertex.label= NA, edge.arrow.size=.4, layout=layout_with_fr, main="Closeness Centrality")

plot(ptbr_g_min_ccent_tt, vertex.size=V(ptbr_g_min_ccent_tt)$ccent*30, vertex.label.cex= 1, layout=layout_with_fr, main="Closeness Centrality for Top 11")

ptbr_g_min_bcent <- delete_vertices(ptbr_g_min, "ptbr_382")

g.mat <- as.matrix(get.adjacency(ptbr_g_min_bcent))
g.bc <- sna::betweenness(g.mat)
plot(ptbr_g_min_bcent, vertex.color= "skyblue", vertex.size=g.bc*0.05, vertex.label= NA, layout=layout_with_fr, main="Betweenness Centrality")

library(keyplayer)

Attaching package: ‘keyplayer’

The following object is masked from ‘package:igraph’:

    contract
ptbr_g_min_am <- as.matrix(get.adjacency(ptbr_g_min))
ptbr_g_min_fragment <- kpset(ptbr_g_min_am, size = 10, type = "fragment")
V(ptbr_g_min)$color <- "skyblue"
V(ptbr_g_min)$color[ptbr_g_min_fragment$keyplayers] <- "salmon"
plot(ptbr_g_min, mark.groups = ptbr_g_min_fragment$keyplayers, mark.col = NA, mark.border = "black",
    vertex.size = 10, vertex.label.cex = 0.3, vertex.label.color = "black",
    edge.arrow.size = 0.25, layout = layout_with_kk, main = "Network w/ Key Players")

library(blockmodeling)
To cite package 'blockmodeling' in publications please use package citation and (at least) one of the articles:

  Žiberna, Aleš (2007). Generalized blockmodeling of valued networks. Social Networks 29(1), 105-126.

  Žiberna, Aleš (2008). Direct and indirect approaches to blockmodeling of valued networks in terms of regular
  equivalence. Journal of Mathematical Sociology 32(1), 57–84.

  Žiberna, Aleš (2014). Blockmodeling of multilevel networks. Social Networks 39, 46–61.
  https://doi.org/10.1016/j.socnet.2014.04.002.

  Žiberna, Aleš (2022).  Generalized and Classical Blockmodeling of Valued Networks, R package version 1.1.3.

To see these entries in BibTeX format, use 'print(<citation>, bibtex=TRUE)', 'toBibtex(.)', or set
'options(citation.bibtex.max=999)'.
rege2<-REGE.ownm.for(M=ptbr_g_min_am)$E 
clu <- cutree(hclust(d=as.dist(1-rege2),method="ward.D"), k=3)
V(ptbr_g_min)[names(clu)]$color <- clu
plot(ptbr_g_min, vertex.color=V(ptbr_g_min)$color, vertex.size=10, vertex.label.cex=0.01, main = "Twitch PTBR top 100 Streamers REGE plot")

LS0tCnRpdGxlOiAiTmV0d29yayBhbmQgUHJlZGljdGl2ZSBBbmFseXRpY3MiCmRhdGU6ICJPY3QgNywgMjAyMiIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CnJtKGxpc3QgPSBscygpKQpzZXR3ZCgnfi9EZXNrdG9wL05ldHdvcmtzICYgUHJlZGljdGl2ZSBBbmFseXRpY3MvUHJvamVjdC8nKQpsaWJyYXJ5KGlncmFwaCkKYGBgCgpgYGB7cn0KZGVfZWRnZXMgPSBhcy5kYXRhLmZyYW1lKHJlYWQuY3N2KCdkZV9lZGdlcy5jc3YnLCBoZWFkZXIgPSBUUlVFKSkKZGVfbm9kZXMgPSBhcy5kYXRhLmZyYW1lKHJlYWQuY3N2KCdkZV9ub2Rlcy5jc3YnLCBoZWFkZXIgPSBUUlVFKSkKCmVuZ2JfZWRnZXMgPSBhcy5kYXRhLmZyYW1lKHJlYWQuY3N2KCdFTkdCX2VkZ2VzLmNzdicsIGhlYWRlciA9IFRSVUUpKQplbmdiX25vZGVzID0gYXMuZGF0YS5mcmFtZShyZWFkLmNzdignRU5HQl9ub2Rlcy5jc3YnLCBoZWFkZXIgPSBUUlVFKSkKCmVzX2VkZ2VzID0gYXMuZGF0YS5mcmFtZShyZWFkLmNzdignRVNfZWRnZXMuY3N2JywgaGVhZGVyID0gVFJVRSkpCmVzX25vZGVzID0gYXMuZGF0YS5mcmFtZShyZWFkLmNzdignRVNfbm9kZXMuY3N2JywgaGVhZGVyID0gVFJVRSkpCgpmcl9lZGdlcyA9IGFzLmRhdGEuZnJhbWUocmVhZC5jc3YoJ0ZSX2VkZ2VzLmNzdicsIGhlYWRlciA9IFRSVUUpKQpmcl9ub2RlcyA9IGFzLmRhdGEuZnJhbWUocmVhZC5jc3YoJ0ZSX25vZGVzLmNzdicsIGhlYWRlciA9IFRSVUUpKQoKcHRicl9lZGdlcyA9IGFzLmRhdGEuZnJhbWUocmVhZC5jc3YoJ1BUQlJfZWRnZXMuY3N2JywgaGVhZGVyID0gVFJVRSkpCnB0YnJfbm9kZXMgPSBhcy5kYXRhLmZyYW1lKHJlYWQuY3N2KCdQVEJSX25vZGVzLmNzdicsIGhlYWRlciA9IFRSVUUpKQoKcnVfZWRnZXMgPSBhcy5kYXRhLmZyYW1lKHJlYWQuY3N2KCdSVV9lZGdlcy5jc3YnLCBoZWFkZXIgPSBUUlVFKSkKcnVfbm9kZXMgPSBhcy5kYXRhLmZyYW1lKHJlYWQuY3N2KCdSVV9ub2Rlcy5jc3YnLCBoZWFkZXIgPSBUUlVFKSkKCmFsbF9lZGdlcyA9IGFzLmRhdGEuZnJhbWUocmVhZC5jc3YoJ3R3aXRjaF9lZGdlcy5jc3YnLCBoZWFkZXIgPSBUUlVFKSkKYWxsX25vZGVzID0gYXMuZGF0YS5mcmFtZShyZWFkLmNzdigndHdpdGNoX25vZGVzLmNzdicsIGhlYWRlciA9IFRSVUUpKQpgYGAKCmBgYHtyfQpkZV9nIDwtIGdyYXBoX2Zyb21fZGF0YV9mcmFtZShkZV9lZGdlcywgZGlyZWN0ZWQgPSBGQUxTRSwgdmVydGljZXMgPSBkZV9ub2RlcykKZW5nYl9nIDwtIGdyYXBoX2Zyb21fZGF0YV9mcmFtZShlbmdiX2VkZ2VzLCBkaXJlY3RlZCA9IEZBTFNFLCB2ZXJ0aWNlcyA9IGVuZ2Jfbm9kZXMpCmVzX2cgPC0gZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKGVzX2VkZ2VzLCBkaXJlY3RlZCA9IEZBTFNFLCB2ZXJ0aWNlcyA9IGVzX25vZGVzKQpmcl9nIDwtIGdyYXBoX2Zyb21fZGF0YV9mcmFtZShmcl9lZGdlcywgZGlyZWN0ZWQgPSBGQUxTRSwgdmVydGljZXMgPSBmcl9ub2RlcykKcHRicl9nIDwtIGdyYXBoX2Zyb21fZGF0YV9mcmFtZShwdGJyX2VkZ2VzLCBkaXJlY3RlZCA9IEZBTFNFLCB2ZXJ0aWNlcyA9IHB0YnJfbm9kZXMpCnJ1X2cgPC0gZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKHJ1X2VkZ2VzLCBkaXJlY3RlZCA9IEZBTFNFLCB2ZXJ0aWNlcyA9IHJ1X25vZGVzKQphbGxfZyA8LSBncmFwaF9mcm9tX2RhdGFfZnJhbWUoYWxsX2VkZ2VzLCBkaXJlY3RlZCA9IEZBTFNFLCB2ZXJ0aWNlcyA9IGFsbF9ub2RlcykKYGBgCgpgYGB7cn0KQ19OYW1lcyA8LSBjKCJERSIsICJFTkdCIiwgIkVTIiwgIkZSIiwgIlBUQlIiLCAiUlUiLCAiQUxMIikKTm9fTm9kZXMgPC0gYyhsZW5ndGgoVihkZV9nKSksIGxlbmd0aChWKGVuZ2JfZykpLCBsZW5ndGgoVihlc19nKSksIGxlbmd0aChWKGZyX2cpKSwgbGVuZ3RoKFYocHRicl9nKSksIGxlbmd0aChWKHJ1X2cpKSwgbGVuZ3RoKFYoYWxsX2cpKSkKTm9fRWRnZXMgPC0gYyhsZW5ndGgoRShkZV9nKSksIGxlbmd0aChFKGVuZ2JfZykpLCBsZW5ndGgoRShlc19nKSksIGxlbmd0aChFKGZyX2cpKSwgbGVuZ3RoKEUocHRicl9nKSksIGxlbmd0aChFKHJ1X2cpKSwgbGVuZ3RoKEUoYWxsX2cpKSkKTldfRGlhbWV0ZXIgPC0gYyhkaWFtZXRlcihkZV9nKSwgZGlhbWV0ZXIoZW5nYl9nKSwgZGlhbWV0ZXIoZXNfZyksIGRpYW1ldGVyKGZyX2cpLCBkaWFtZXRlcihwdGJyX2cpLCBkaWFtZXRlcihydV9nKSwgJ05BJykKTldfQXZnX0Rpc3QgPC0gYyhtZWFuX2Rpc3RhbmNlKGRlX2cpLCBtZWFuX2Rpc3RhbmNlKGVuZ2JfZyksIG1lYW5fZGlzdGFuY2UoZXNfZyksIG1lYW5fZGlzdGFuY2UoZnJfZyksIG1lYW5fZGlzdGFuY2UocHRicl9nKSwgbWVhbl9kaXN0YW5jZShydV9nKSwgJ05BJykKTldfRGVuc2l0eSA8LSBjKGVkZ2VfZGVuc2l0eShkZV9nKSwgZWRnZV9kZW5zaXR5KGVuZ2JfZyksIGVkZ2VfZGVuc2l0eShlc19nKSwgZWRnZV9kZW5zaXR5KGZyX2cpLCBlZGdlX2RlbnNpdHkocHRicl9nKSwgZWRnZV9kZW5zaXR5KHJ1X2cpLCAnTkEnKQpOV19BdmdfRGVncmVlIDwtIGMobWVhbihkZWdyZWUoZGVfZykpLCBtZWFuKGRlZ3JlZShlbmdiX2cpKSwgbWVhbihkZWdyZWUoZXNfZykpLCBtZWFuKGRlZ3JlZShmcl9nKSksIG1lYW4oZGVncmVlKHB0YnJfZykpLCBtZWFuKGRlZ3JlZShydV9nKSksICdOQScpCk5XX0NvaGVzaW9uIDwtIGMoY29oZXNpb24oZGVfZyksIGNvaGVzaW9uKGVuZ2JfZyksIGNvaGVzaW9uKGVzX2cpLCBjb2hlc2lvbihmcl9nKSwgY29oZXNpb24ocHRicl9nKSwgY29oZXNpb24ocnVfZyksICdOQScpCk5XX0NvbXBhY3RuZXNzIDwtIGMobWVhbihjbG9zZW5lc3MoZGVfZykpLCBtZWFuKGNsb3NlbmVzcyhlbmdiX2cpKSwgbWVhbihjbG9zZW5lc3MoZXNfZykpLCBtZWFuKGNsb3NlbmVzcyhmcl9nKSksIG1lYW4oY2xvc2VuZXNzKHB0YnJfZykpLCBtZWFuKGNsb3NlbmVzcyhydV9nKSksICdOQScpCmZfaW5mbyA8LSBkYXRhLmZyYW1lKENfTmFtZXMsIE5vX05vZGVzLCBOb19FZGdlcywgTldfRGlhbWV0ZXIsIE5XX0F2Z19EaXN0LCBOV19EZW5zaXR5LCBOV19BdmdfRGVncmVlLCBOV19Db21wYWN0bmVzcykKZl9pbmZvCmBgYAoKYGBge3J9CnJtKGxpc3QgPSBscygpKQpsaWJyYXJ5KGlncmFwaCkKbGlicmFyeSgiUkNvbG9yQnJld2VyIikKCnBhbCA8LSBicmV3ZXIucGFsKDEyLCAnU2V0MycpCnBhbDIgPC0gYnJld2VyLnBhbCgxMSwgJ1NwZWN0cmFsJykKCnB0YnJfZWRnZXMgPSBhcy5kYXRhLmZyYW1lKHJlYWQuY3N2KCdQVEJSX2VkZ2VzLmNzdicsIGhlYWRlciA9IFRSVUUpKQpwdGJyX25vZGVzID0gYXMuZGF0YS5mcmFtZShyZWFkLmNzdignUFRCUl9ub2Rlcy5jc3YnLCBoZWFkZXIgPSBUUlVFKSkKCnB0YnJfZyA8LSBncmFwaF9mcm9tX2RhdGFfZnJhbWUocHRicl9lZGdlcywgZGlyZWN0ZWQgPSBGQUxTRSwgdmVydGljZXMgPSBwdGJyX25vZGVzKQpgYGAKCmBgYHtyfQpwdGJyX2cKYGBgCgpgYGB7cn0KcGxvdChwdGJyX2csIGxheW91dD1sYXlvdXRfd2l0aF9raywgdmVydGV4LnNpemU9IDUsIHZlcnRleC5sYWJlbD0gTkEsIHZlcnRleC5jb2xvciA9ICdza3libHVlJywgbWFpbj0iTmV0d29yayBCZWZvcmUgRmlsdGVyaW5nIikKYGBgCgpgYGB7cn0KaGlzdChjZW50cmFsaXphdGlvbi5kZWdyZWUocHRicl9nLCBtb2RlPSdhbGwnKSRyZXMsIGJyZWFrcyA9IDEwMCwgeGxhYiA9ICdEZWdyZWUnLCB5bGFiID0gJ0ZyZXF1ZW5jeScsIG1haW4gPSAnSGlzdG9ncmFtIG9mIERlZ3JlZSBDZW50cmFsaXR5XG4gQmVmb3JlIEZpbHRlcmluZycpCmBgYAoKYGBge3J9CnB0YnJfbm9kZXNfbWluIDwtIHB0YnJfbm9kZXNbb3JkZXIoLXB0YnJfbm9kZXMkdmlld3MpLF1bMToxMDAsXQpwdGJyX2VkZ2VzX21pbiA8LSBwdGJyX2VkZ2VzW3doaWNoKHB0YnJfZWRnZXMkZnJvbSAlaW4lIHB0YnJfbm9kZXNfbWluJGlkICYgcHRicl9lZGdlcyR0byAlaW4lIHB0YnJfbm9kZXNfbWluJGlkKSxdCmBgYAoKYGBge3J9CnBhcihtZnJvdz1jKDEsMiksIG1hcj1jKDEsMSwxLDEpKQpwdGJyX2dfbWluIDwtIGdyYXBoX2Zyb21fZGF0YV9mcmFtZShwdGJyX2VkZ2VzX21pbiwgZGlyZWN0ZWQgPSBGQUxTRSwgdmVydGljZXMgPSBwdGJyX25vZGVzX21pbikKcGxvdChwdGJyX2csIGxheW91dD1sYXlvdXRfd2l0aF9raywgdmVydGV4LnNpemU9IDUsIHZlcnRleC5sYWJlbD0gTkEsIHZlcnRleC5jb2xvciA9ICdza3libHVlJywgbWFpbj0iTmV0d29yayBCZWZvcmUgRmlsdGVyaW5nIikKcGxvdChwdGJyX2dfbWluLCBsYXlvdXQ9bGF5b3V0X3dpdGhfa2ssIHZlcnRleC5zaXplPSA4LCB2ZXJ0ZXgubGFiZWw9IE5BLCB2ZXJ0ZXguY29sb3I9ICdza3libHVlJywgbWFpbj0iTmV0d29yayBBZnRlciBGaWx0ZXJpbmciKQpgYGAKCmBgYHtyfQphc19kYXRhX2ZyYW1lKHB0YnJfZ19taW4sIHdoYXQ9InZlcnRpY2VzIikKYGBgCgpgYGB7cn0KcHRicl9jb2xuYW1lcyA8LSBjKCJTaXplIiwgIk5vX0VkZ2VzIiwgIkRpYW1ldGVyIiwgIkF2ZXJhZ2UgRGlzdGFuY2UiLCAiRGVncmVlIENlbnRyYWxpdHkiLCAiU0QgRGVncmVlIENlbnRyYWxpdHkiLCAiQ2xvc2VuZXNzIENlbnRyYWxpdHkiLCAiU0QgQ2xvc2VuZXNzIENlbnRyYWxpdHkiLCAiQmV0d2Vlbm5lc3MgQ2VudHJhbGl0eSIsICJTRCBCZXR3ZWVubmVzcyBDZW50cmFsaXR5IiwgIkRlbnNpdHkiLCAiQXZlcmFnZSBEZWdyZWUiLCAiQ29oZXNpb24iLCAiQ29tcGFjdG5lc3MiLCAiQ2x1c3RlcmluZyBDb2VmZmljaWVudCIpCgpwdGJyX3ZhbHVlcyA8LSBjKGxlbmd0aChWKHB0YnJfZ19taW4pKSwgbGVuZ3RoKEUocHRicl9nX21pbikpLCBkaWFtZXRlcihwdGJyX2dfbWluKSwgbWVhbl9kaXN0YW5jZShwdGJyX2dfbWluKSwgY2VudHJhbGl6YXRpb24uZGVncmVlKHB0YnJfZ19taW4pJGNlbnRyYWxpemF0aW9uLCBzZChjZW50cmFsaXphdGlvbi5kZWdyZWUocHRicl9nX21pbikkcmVzKSwgY2VudHJhbGl6YXRpb24uY2xvc2VuZXNzKHB0YnJfZ19taW4pJGNlbnRyYWxpemF0aW9uLCBzZChjZW50cmFsaXphdGlvbi5jbG9zZW5lc3MocHRicl9nX21pbikkcmVzKSwgY2VudHJhbGl6YXRpb24uYmV0d2Vlbm5lc3MocHRicl9nX21pbikkY2VudHJhbGl6YXRpb24sIHNkKGNlbnRyYWxpemF0aW9uLmJldHdlZW5uZXNzKHB0YnJfZ19taW4pJHJlcyksIGVkZ2VfZGVuc2l0eShwdGJyX2dfbWluKSwgbWVhbihkZWdyZWUocHRicl9nX21pbikpLCBjb2hlc2lvbihwdGJyX2dfbWluKSwgbWVhbihjbG9zZW5lc3MocHRicl9nX21pbikpLCB0cmFuc2l0aXZpdHkocHRicl9nX21pbix0eXBlPSJnbG9iYWwiKSkKcHRicl9pbmZvIDwtIGRhdGEuZnJhbWUocHRicl9jb2xuYW1lcywgcHRicl92YWx1ZXMpCmNvbG5hbWVzKHB0YnJfaW5mbykgPC0gYygnTWV0cmljJywnVmFsdWVzJykKcHRicl9pbmZvCmBgYAoKYGBge3J9CnBhcihtZnJvdz1jKDEsMiksIG1hcj1jKDIsMiwyLDIpKQpoaXN0KGNlbnRyYWxpemF0aW9uLmRlZ3JlZShwdGJyX2csIG1vZGU9J2FsbCcpJHJlcywgYnJlYWtzID0gMTAwLCB4bGFiID0gJ0RlZ3JlZScsIHlsYWIgPSAnRnJlcXVlbmN5JywgbWFpbiA9ICdIaXN0b2dyYW0gb2YgRGVncmVlIENlbnRyYWxpdHlcbiBCZWZvcmUgRmlsdGVyaW5nJykKaGlzdChjZW50cmFsaXphdGlvbi5kZWdyZWUocHRicl9nX21pbiwgbW9kZT0nYWxsJykkcmVzLCBicmVha3MgPSAxMDAsIHhsYWIgPSAnRGVncmVlJywgeWxhYiA9ICdGcmVxdWVuY3knLCBtYWluID0gJ0hpc3RvZ3JhbSBvZiBEZWdyZWUgQ2VudHJhbGl0eVxuIEFmdGVyIEZpbHRlcmluZycpCmBgYAoKYGBge3J9CnNldC5zZWVkKDEwMDApCnBhcihtZnJvdyA9IGMoMSwgMiksIG1hciA9IGMoMiwgMiwgMiwgMikpCmNfZzIgPC0gZmFzdGdyZWVkeS5jb21tdW5pdHkocHRicl9nX21pbikKcmVzX2cyIDwtIHNpbXBsaWZ5KGNvbnRyYWN0KHB0YnJfZ19taW4sIG1lbWJlcnNoaXAoY19nMikpLCByZW1vdmUubXVsdGlwbGUgPSBUUlVFLCByZW1vdmUubG9vcHMgPSBUUlVFKQpwbG90KHJlc19nMiwgdmVydGV4LnNpemU9IDEwLCB2ZXJ0ZXgubGFiZWwgPSBOQSwgbGF5b3V0PWxheW91dF93aXRoX2trLCB2ZXJ0ZXguY29sb3I9cGFsLCBtYWluPSJGYXN0R3JlZWR5IENvbW11bml0eSIpCgpjX2czIDwtIGNsdXN0ZXJfbG91dmFpbihwdGJyX2dfbWluKQpyZXNfZzMgPC0gc2ltcGxpZnkoY29udHJhY3QocHRicl9nX21pbiwgbWVtYmVyc2hpcChjX2czKSksIHJlbW92ZS5tdWx0aXBsZSA9IFRSVUUsIHJlbW92ZS5sb29wcyA9IFRSVUUpCiNwbG90KHJlc19nMywgdmVydGV4LnNpemU9IDEwLCB2ZXJ0ZXgubGFiZWwgPSBOQSwgbWFpbiA9IGxlbmd0aChyZXNfZzMpLCBsYXlvdXQ9bGF5b3V0X3dpdGhfa2ssIHZlcnRleC5jb2xvcj1wYWwpCgpjX2c0IDwtIHNwaW5nbGFzcy5jb21tdW5pdHkocHRicl9nX21pbikKcmVzX2c0IDwtIHNpbXBsaWZ5KGNvbnRyYWN0KHB0YnJfZ19taW4sIG1lbWJlcnNoaXAoY19nNCkpLCByZW1vdmUubXVsdGlwbGUgPSBUUlVFLCByZW1vdmUubG9vcHMgPSBUUlVFKQpwbG90KHJlc19nNCwgdmVydGV4LnNpemU9IDEwLCB2ZXJ0ZXgubGFiZWwgPSBOQSwgbWFpbiA9ICJTcGluZ2xhc3MgQ29tbXVuaXR5IiwgbGF5b3V0PWxheW91dF93aXRoX2trLCB2ZXJ0ZXguY29sb3I9cGFsKQoKY19nNSA8LSB3YWxrdHJhcC5jb21tdW5pdHkocHRicl9nX21pbikKcmVzX2c1IDwtIHNpbXBsaWZ5KGNvbnRyYWN0KHB0YnJfZ19taW4sIG1lbWJlcnNoaXAoY19nNSkpLCByZW1vdmUubXVsdGlwbGUgPSBUUlVFLCByZW1vdmUubG9vcHMgPSBUUlVFKQojcGxvdChyZXNfZzUsIHZlcnRleC5zaXplPSAxMCwgdmVydGV4LmxhYmVsID0gTkEsIG1haW4gPSBsZW5ndGgocmVzX2c1KSwgbGF5b3V0PWxheW91dF93aXRoX2trLCB2ZXJ0ZXguY29sb3I9cGFsKQpgYGAKCmBgYHtyfQpjX2dfZ3JvdXBzMiA8LSBncm91cHMoY19nMikKc29ydChsZW5ndGhzKGNfZ19ncm91cHMyKSwgZGVjcmVhc2luZyA9IFRSVUUpCmBgYAoKYGBge3J9CmNfZ19ncm91cHM0IDwtIGdyb3VwcyhjX2c0KQpzb3J0KGxlbmd0aHMoY19nX2dyb3VwczQpLCBkZWNyZWFzaW5nID0gVFJVRSkKYGBgCgpgYGB7cn0KcGFyKG1mcm93ID0gYygxLCAyKSwgbWFyID0gYygyLCAyLCAyLCAyKSkKcGxvdChwdGJyX2dfbWluLCB2ZXJ0ZXguY29sb3I9cGFsW21lbWJlcnNoaXAoY19nMildLCBsYXlvdXQ9bGF5b3V0X3dpdGhfa2ssIHZlcnRleC5zaXplPSAxMCwgdmVydGV4LmxhYmVsLmNleCA9IDAuNSwgbWFpbj0iRmFzdCBHcmVlZHkgQ29tbXVuaXR5IikKcGxvdChwdGJyX2dfbWluLCB2ZXJ0ZXguY29sb3I9cGFsW21lbWJlcnNoaXAoY19nNCldLCBsYXlvdXQ9bGF5b3V0X3dpdGhfa2ssIHZlcnRleC5zaXplPSAxMCwgdmVydGV4LmxhYmVsLmNleCA9IDAuNSwgbWFpbj0iU3BpbkdsYXNzIENvbW11bml0eSIpCmBgYAoKYGBge3J9CmxpYnJhcnkodGhyZWVqcykKCm5ldCA8LSBwdGJyX2dfbWluClYobmV0KSRjb2xvciA8LSBwYWxbbWVtYmVyc2hpcChjX2cyKV0KVihuZXQpJHNpemUgPC0gNQpFKG5ldCkkY29sb3IgPSAnYmxhY2snCgpncmFwaGpzKG5ldCwgc2hvd0xhYmVscyA9IFQpCmBgYAoKYGBge3J9CmxpYnJhcnkodGhyZWVqcykKCm5ldCA8LSBwdGJyX2dfbWluClYobmV0KSRjb2xvciA8LSBwYWxbbWVtYmVyc2hpcChjX2c0KV0KVihuZXQpJHNpemUgPC0gNQpFKG5ldCkkY29sb3IgPSAnYmxhY2snCgpncmFwaGpzKG5ldCwgc2hvd0xhYmVscyA9IFQpCmBgYAoKYGBge3J9CnBhcihtZnJvdz1jKDEsMiksIG1hcj1jKDEsMSwxLDEpKQpwdGJyX2dfbWluX2RjZW50IDwtIGRlbGV0ZV92ZXJ0aWNlcyhwdGJyX2dfbWluLCAicHRicl8zODIiKQoKVihwdGJyX2dfbWluX2RjZW50KSRkY2VudCA8LSBjZW50cmFsaXphdGlvbi5kZWdyZWUocHRicl9nX21pbl9kY2VudCkkcmVzClYocHRicl9nX21pbl9kY2VudCkkY29sb3IgPC0gaWZlbHNlKFYocHRicl9nX21pbl9kY2VudCkkZGNlbnQgPiA0OSwgcGFsMiwgJ3doaXRlJykKCnB0YnJfZ19taW5fZGNlbnRfdHQgPC0gaW5kdWNlZF9zdWJncmFwaChwdGJyX2dfbWluX2RjZW50LCBWKHB0YnJfZ19taW5fZGNlbnQpW3doaWNoKFYocHRicl9nX21pbl9kY2VudCkkZGNlbnQgPiA0OSldKQoKcGxvdChwdGJyX2dfbWluX2RjZW50LCB2ZXJ0ZXguc2l6ZT1WKHB0YnJfZ19taW5fZGNlbnQpJGRjZW50KjAuMjUsIHZlcnRleC5sYWJlbD0gTkEsIGxheW91dD1sYXlvdXRfd2l0aF9mciwgbWFpbj0iRGVncmVlIENlbnRyYWxpdHkiKQoKcGxvdChwdGJyX2dfbWluX2RjZW50X3R0LCB2ZXJ0ZXgubGFiZWwuY2V4PSAxLCB2ZXJ0ZXguc2l6ZT1WKHB0YnJfZ19taW5fZGNlbnRfdHQpJGRjZW50KjAuMzAsIGxheW91dD1sYXlvdXRfd2l0aF9mciwgbWFpbj0iRGVncmVlIENlbnRyYWxpdHkgZm9yIFRvcCAxMSIpCmBgYAoKYGBge3J9CnBhcihtZnJvdz1jKDEsMiksIG1hcj1jKDEsMSwxLDEpKQpwdGJyX2dfbWluX2V2Y2VudCA8LSBkZWxldGVfdmVydGljZXMocHRicl9nX21pbiwgInB0YnJfMzgyIikKClYocHRicl9nX21pbl9ldmNlbnQpJGV2Y2VudCA8LSBlaWdlbl9jZW50cmFsaXR5KHB0YnJfZ19taW5fZXZjZW50KSR2ZWN0b3IKVihwdGJyX2dfbWluX2V2Y2VudCkkY29sb3IgPC0gaWZlbHNlKFYocHRicl9nX21pbl9ldmNlbnQpJGV2Y2VudCA+IDAuODU4OTIxMSwgcGFsMiwgJ3doaXRlJykKCnB0YnJfZ19taW5fZXZjZW50X3R0IDwtIGluZHVjZWRfc3ViZ3JhcGgocHRicl9nX21pbl9ldmNlbnQsIFYocHRicl9nX21pbl9ldmNlbnQpW3doaWNoKFYocHRicl9nX21pbl9ldmNlbnQpJGV2Y2VudCA+IDAuODU4OTIxMSldKQoKcGxvdChwdGJyX2dfbWluX2V2Y2VudCwgdmVydGV4LnNpemU9VihwdGJyX2dfbWluX2V2Y2VudCkkZXZjZW50KjE1LCB2ZXJ0ZXgubGFiZWw9IE5BLCBlZGdlLmFycm93LnNpemU9LjQsIGxheW91dD1sYXlvdXRfd2l0aF9mciwgbWFpbj0iRWlnZW5WZWN0b3IgQ2VudHJhbGl0eSIpCgpwbG90KHB0YnJfZ19taW5fZXZjZW50X3R0LCB2ZXJ0ZXguc2l6ZT1WKHB0YnJfZ19taW5fZXZjZW50X3R0KSRldmNlbnQqMjAsIHZlcnRleC5sYWJlbC5jZXg9IDEsIGxheW91dD1sYXlvdXRfd2l0aF9mciwgbWFpbj0iRWlnZW5WZWN0b3IgQ2VudHJhbGl0eSBmb3IgVG9wIDEwIikKYGBgCgpgYGB7cn0KcGFyKG1mcm93PWMoMSwyKSwgbWFyPWMoMSwxLDEsMSkpCnB0YnJfZ19taW5fY2NlbnQgPC0gZGVsZXRlX3ZlcnRpY2VzKHB0YnJfZ19taW4sICJwdGJyXzM4MiIpCgpWKHB0YnJfZ19taW5fY2NlbnQpJGNjZW50IDwtIGNlbnRyYWxpemF0aW9uLmNsb3NlbmVzcyhwdGJyX2dfbWluX2NjZW50KSRyZXMKVihwdGJyX2dfbWluX2NjZW50KSRjb2xvciA8LSBpZmVsc2UoVihwdGJyX2dfbWluX2NjZW50KSRjY2VudCA+IDAuNjY2NjY2NywgcGFsMiwgJ3doaXRlJykKCnB0YnJfZ19taW5fY2NlbnRfdHQgPC0gaW5kdWNlZF9zdWJncmFwaChwdGJyX2dfbWluX2NjZW50LCBWKHB0YnJfZ19taW5fY2NlbnQpW3doaWNoKFYocHRicl9nX21pbl9jY2VudCkkY2NlbnQgPiAwLjY2NjY2NjcpXSkKCnBsb3QocHRicl9nX21pbl9jY2VudCwgdmVydGV4LnNpemU9VihwdGJyX2dfbWluX2NjZW50KSRjY2VudCoxNSwgdmVydGV4LmxhYmVsPSBOQSwgZWRnZS5hcnJvdy5zaXplPS40LCBsYXlvdXQ9bGF5b3V0X3dpdGhfZnIsIG1haW49IkNsb3NlbmVzcyBDZW50cmFsaXR5IikKCnBsb3QocHRicl9nX21pbl9jY2VudF90dCwgdmVydGV4LnNpemU9VihwdGJyX2dfbWluX2NjZW50X3R0KSRjY2VudCozMCwgdmVydGV4LmxhYmVsLmNleD0gMSwgbGF5b3V0PWxheW91dF93aXRoX2ZyLCBtYWluPSJDbG9zZW5lc3MgQ2VudHJhbGl0eSBmb3IgVG9wIDExIikKYGBgCgpgYGB7cn0KcHRicl9nX21pbl9iY2VudCA8LSBkZWxldGVfdmVydGljZXMocHRicl9nX21pbiwgInB0YnJfMzgyIikKCmcubWF0IDwtIGFzLm1hdHJpeChnZXQuYWRqYWNlbmN5KHB0YnJfZ19taW5fYmNlbnQpKQpnLmJjIDwtIHNuYTo6YmV0d2Vlbm5lc3MoZy5tYXQpCnBsb3QocHRicl9nX21pbl9iY2VudCwgdmVydGV4LmNvbG9yPSAic2t5Ymx1ZSIsIHZlcnRleC5zaXplPWcuYmMqMC4wNSwgdmVydGV4LmxhYmVsPSBOQSwgbGF5b3V0PWxheW91dF93aXRoX2ZyLCBtYWluPSJCZXR3ZWVubmVzcyBDZW50cmFsaXR5IikKYGBgCgpgYGB7cn0KbGlicmFyeShrZXlwbGF5ZXIpCnB0YnJfZ19taW5fYW0gPC0gYXMubWF0cml4KGdldC5hZGphY2VuY3kocHRicl9nX21pbikpCnB0YnJfZ19taW5fZnJhZ21lbnQgPC0ga3BzZXQocHRicl9nX21pbl9hbSwgc2l6ZSA9IDEwLCB0eXBlID0gImZyYWdtZW50IikKVihwdGJyX2dfbWluKSRjb2xvciA8LSAic2t5Ymx1ZSIKVihwdGJyX2dfbWluKSRjb2xvcltwdGJyX2dfbWluX2ZyYWdtZW50JGtleXBsYXllcnNdIDwtICJzYWxtb24iCnBsb3QocHRicl9nX21pbiwgbWFyay5ncm91cHMgPSBwdGJyX2dfbWluX2ZyYWdtZW50JGtleXBsYXllcnMsIG1hcmsuY29sID0gTkEsIG1hcmsuYm9yZGVyID0gImJsYWNrIiwKICAgIHZlcnRleC5zaXplID0gMTAsIHZlcnRleC5sYWJlbC5jZXggPSAwLjMsIHZlcnRleC5sYWJlbC5jb2xvciA9ICJibGFjayIsCiAgICBlZGdlLmFycm93LnNpemUgPSAwLjI1LCBsYXlvdXQgPSBsYXlvdXRfd2l0aF9raywgbWFpbiA9ICJOZXR3b3JrIHcvIEtleSBQbGF5ZXJzIikKYGBgCgpgYGB7cn0KbGlicmFyeShibG9ja21vZGVsaW5nKQpyZWdlMjwtUkVHRS5vd25tLmZvcihNPXB0YnJfZ19taW5fYW0pJEUgCmNsdSA8LSBjdXRyZWUoaGNsdXN0KGQ9YXMuZGlzdCgxLXJlZ2UyKSxtZXRob2Q9IndhcmQuRCIpLCBrPTMpClYocHRicl9nX21pbilbbmFtZXMoY2x1KV0kY29sb3IgPC0gY2x1CnBsb3QocHRicl9nX21pbiwgdmVydGV4LmNvbG9yPVYocHRicl9nX21pbikkY29sb3IsIHZlcnRleC5zaXplPTEwLCB2ZXJ0ZXgubGFiZWwuY2V4PTAuMDEsIG1haW4gPSAiVHdpdGNoIFBUQlIgdG9wIDEwMCBTdHJlYW1lcnMgUkVHRSBwbG90IikKYGBgCgo=